from rest_framework import viewsets, filters
from rest_framework.response import Response
from rest_framework.decorators import api_view
from homeApp.models import Goods
from homeApp.serializers import GoodsSerializer
from rest_framework.pagination import PageNumberPagination
from django.db.models import Q

class SearchPagination(PageNumberPagination):
    # 自定义分页类
    page_size = 20
    page_size_query_param = 'page_size'
    max_page_size = 100

@api_view(['GET'])
def global_search(request):
    """
    全局搜索API，支持以下参数：
    - q: 搜索关键词
    - page: 页码
    - page_size: 每页数量
    - categories: 分类过滤（可选，逗号分隔）
    - min_price: 最低价格（可选）
    - max_price: 最高价格（可选）
    - sort_by: 排序方式（可选）
    """
    try:
        # 获取搜索参数
        query = request.GET.get('q', '').strip()
        categories_str = request.GET.get('categories', '')
        categories = [cat.strip() for cat in categories_str.split(',')] if categories_str else []
        min_price = request.GET.get('min_price', None)
        max_price = request.GET.get('max_price', None)
        sort_by = request.GET.get('sort_by', 'relevance')
        
        # 验证必要参数
        if not query:
            return Response({
                'code': 400,
                'message': '搜索关键词不能为空',
                'data': {}
            }, status=400)
        
        # 使用Django ORM直接搜索，不依赖haystack
        # 构建搜索条件（只使用模型中存在的字段）
        search_filter = Q(title__icontains=query) | Q(description__icontains=query) | Q(subtitle__icontains=query)
        goods_list = Goods.objects.filter(search_filter, is_active=True)
        
        # 价格过滤
        if min_price is not None:
            try:
                min_price_float = float(min_price)
                goods_list = goods_list.filter(price__gte=min_price_float)
            except ValueError:
                return Response({
                    'code': 400,
                    'message': '最低价格必须是数字',
                    'data': {}
                }, status=400)
        
        if max_price is not None:
            try:
                max_price_float = float(max_price)
                goods_list = goods_list.filter(price__lte=max_price_float)
            except ValueError:
                return Response({
                    'code': 400,
                    'message': '最高价格必须是数字',
                    'data': {}
                }, status=400)
        
        # 分类过滤（暂时注释，因为Goods模型中没有category字段）
        # if categories and categories != ['']:
        #     goods_list = goods_list.filter(category__in=categories)
        
        # 排序处理
        if sort_by == 'price_asc':
            goods_list = goods_list.order_by('price')
        elif sort_by == 'price_desc':
            goods_list = goods_list.order_by('-price')
        elif sort_by == 'sales':
            # 假设Goods模型有sales字段
            goods_list = goods_list.order_by('-sales')
        else:  # relevance
            # 使用默认排序（可以根据需要调整相关度排序逻辑）
            pass  # Django ORM查询保持原样
        
        # 分页处理
        paginator = SearchPagination()
        page = paginator.paginate_queryset(goods_list, request)
        
        if page is not None:
            # 序列化数据（传递request到context）
            serializer = GoodsSerializer(page, many=True, context={'request': request})
            # 构建符合前端期望的响应格式
            return Response({
                    'code': 200,
                    'message': '搜索成功',
                    'data': {
                        'results': serializer.data,
                        'total': paginator.page.paginator.count
                    }
                })
        
        # 如果不需要分页
        # 序列化数据（传递request到context）
        serializer = GoodsSerializer(goods_list, many=True, context={'request': request})
        return Response({
            'code': 200,
            'message': '搜索成功',
            'data': {
                'results': serializer.data,
                'total': len(goods_list)
            }
        })
        
    except Exception as e:
        # 错误处理
        return Response({
            'code': 500,
            'message': f'搜索过程中发生错误: {str(e)}',
            'data': {}
        }, status=500)

@api_view(['GET'])
def search_suggestions(request):
    """
    获取搜索建议API，用于前端自动补全功能
    - q: 搜索关键词
    """
    try:
        query = request.GET.get('q', '').strip()
        
        if not query or len(query) < 2:
            return Response({
                'code': 200,
                'message': '建议列表',
                'data': []
            })
        
        # 使用Django ORM获取建议，只匹配标题
        suggestions = Goods.objects.filter(title__icontains=query, is_active=True).values_list('title', flat=True)[:10]
        
        # 转换为列表
        suggestions_list = list(set(suggestions))
        
        return Response({
            'code': 200,
            'message': '建议列表',
            'data': suggestions_list
        })
        
    except Exception as e:
        return Response({
            'code': 500,
            'message': f'获取建议失败：{str(e)}',
            'data': []
        }, status=500)
